package com.eddie.juc.cf;

import com.eddie.juc.IThreadPool;
import lombok.SneakyThrows;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

/**
 * @author Eddie
 * @date 2022/08/18 10:01
 **/
public class CompletableFutureApiDemo {
    private static final IThreadPool threadPool = IThreadPool.getInstance();

    @SneakyThrows
    public static void main(String[] args) {
        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return "abc";
        }, threadPool);
        //get，会报编译时异常
//        System.out.println(completableFuture.get());
        //设置等待时间，超过时间没有返回结果直接报TimeOut异常，超时
//        System.out.println(completableFuture.get(2L,TimeUnit.SECONDS));
        //join，和get相同，不过不会报编译时异常
//        System.out.println(completableFuture.join());
        //假如两秒后再要
        TimeUnit.SECONDS.sleep(2);
        //getNow -> 如果说有返回的参数就直接返回，没有则返回给定的方法值
        //如果不等待直接获取，则因为异步任务中的一秒睡眠没到期就直接返回xxx
        //如果main主方法在这之前等待了两秒，异步任务已经执行完毕，下面方法就会返回abc
//        System.out.println(completableFuture.getNow("xxx"));
//        completableFuture.complete("completableFuture")
        //方法说明：如果在调用时异步任务还没结束，就直接将返回值设置为自定义的，设置成功返回true，否则返回false，同时也能表示异步任务执行是否成功
        System.out.println(completableFuture.complete("completableFuture") + "\t" + completableFuture.join());

        threadPool.shutdown();
    }
}
